home *** CD-ROM | disk | FTP | other *** search
/ Libris Britannia 4 / science library(b).zip / science library(b) / PROGRAMM / ASSEMBLE / H145.ZIP / ASXXXX_3.ZIP / M05MCH.C < prev    next >
C/C++ Source or Header  |  1990-07-18  |  3KB  |  213 lines

  1. /* m05mch.c */
  2.  
  3. /*
  4.  * (C) Copyright 1989,1990
  5.  * All Rights Reserved
  6.  *
  7.  * Alan R. Baldwin
  8.  * 721 Berkeley St.
  9.  * Kent, Ohio  44240
  10.  */
  11.  
  12. #include <stdio.h>
  13. #include <setjmp.h>
  14. #include "asm.h"
  15. #include "m6805.h"
  16.  
  17. /*
  18.  * Process a machine op.
  19.  */
  20. VOID
  21. machine(mp)
  22. struct mne *mp;
  23. {
  24.     register op, t1, t2, type;
  25.     struct expr e1, e2, e3;
  26.     addr_t espv;
  27.     struct area *espa;
  28.     char id[NCPS];
  29.     int c, v1;
  30.  
  31.     op = mp->m_valu;
  32.     type = mp->m_type;
  33.     switch (type) {
  34.  
  35.     case S_SDP:
  36.         e1.e_mode = 0;
  37.         e1.e_flag = 0;
  38.         e1.e_addr = 0;
  39.         e1.e_base.e_ap = NULL;
  40.         espa = NULL;
  41.         if (more()) {
  42.             expr(&e1, 0);
  43.             if (e1.e_flag == 0 && e1.e_base.e_ap == NULL) {
  44.                 if (e1.e_addr) {
  45.                     err('b');
  46.                 }
  47.             }
  48.             if ((c = getnb()) == ',') {
  49.                 getid(id, -1);
  50.                 espa = alookup(id);
  51.                 if (espa == NULL) {
  52.                     err('u');
  53.                 }
  54.             } else {
  55.                 unget(c);
  56.             }
  57.         }
  58.         if (espa) {
  59.             outdp(espa, &e1);
  60.         } else {
  61.             outdp(dot.s_area, &e1);
  62.         }
  63.         lmode = SLIST;
  64.         break;
  65.  
  66.     case S_INH:
  67.         outab(op);
  68.         break;
  69.  
  70.     case S_BRA:
  71.         expr(&e1, 0);
  72.         outab(op);
  73.         if (e1.e_base.e_ap == NULL || e1.e_base.e_ap == dot.s_area) {
  74.             v1 = e1.e_addr - dot.s_addr - 1;
  75.             if ((v1 < -128) || (v1 > 127))
  76.                 aerr();
  77.             outab(v1);
  78.         } else {
  79.             outrb(&e1, R_PCR);
  80.         }
  81.         if (e1.e_mode != S_USER)
  82.             rerr();
  83.         break;
  84.  
  85.     case S_TYP1:
  86.         t1 = addr(&e1);
  87.         if (t1 == S_A) {
  88.             outab(op+0x10);
  89.             break;
  90.         }
  91.         if (t1 == S_X) {
  92.             outab(op+0x20);
  93.             break;
  94.         }
  95.         if (t1 == S_DIR || t1 == S_EXT) {
  96.             outab(op);
  97.             outrb(&e1, R_PAG0);
  98.             break;
  99.         }
  100.         if (t1 == S_IX) {
  101.             outab(op+0x40);
  102.             break;
  103.         }
  104.         if (t1 == S_I8X || t1 == S_INDX) {
  105.             outab(op+0x30);
  106.             outrb(&e1, R_USGN);
  107.             break;
  108.         }
  109.         aerr();
  110.         break;
  111.  
  112.     case S_TYP2:
  113.         t1 = addr(&e1);
  114.         espv = e1.e_addr;
  115.         espa = e1.e_base.e_ap;
  116.         if (t1 == S_IMMED) {
  117.             if ((op == 0xA7) ||
  118.                 (op == 0xAC) ||
  119.                 (op == 0xAF))
  120.                 aerr();
  121.             outab(op);
  122.             outrb(&e1, 0);
  123.             break;
  124.         }
  125.         if (t1 == S_DIR) {
  126.             outab(op+0x10);
  127.             outrb(&e1, R_PAG0);
  128.             break;
  129.         }
  130.         if (t1 == S_EXT) {
  131.             outab(op+0x20);
  132.             outrw(&e1, 0);
  133.             break;
  134.         }
  135.         if (t1 == S_IX) {
  136.             outab(op+0x50);
  137.             break;
  138.         }
  139.         if (t1 == S_I8X) {
  140.             outab(op+0x40);
  141.             outrb(&e1, R_USGN);
  142.             break;
  143.         }
  144.         if (t1 == S_INDX) {
  145.             outab(op+0x30);
  146.             outrw(&e1, 0);
  147.             break;
  148.         }
  149.         aerr();
  150.         break;
  151.  
  152.     case S_TYP3:
  153.         t1 = addr(&e1);
  154.         espv = e1.e_addr;
  155.         if (t1 != S_IMMED || espv & ~0x07)
  156.             aerr();
  157.         comma();
  158.         t2 = addr(&e2);
  159.         if (t2 != S_DIR)
  160.             aerr();
  161.         outab(op + 2*(espv&0x07));
  162.         outrb(&e2, R_PAG0);
  163.         break;
  164.  
  165.     case S_TYP4:
  166.         t1 = addr(&e1);
  167.         espv = e1.e_addr;
  168.         if (t1 != S_IMMED || espv & ~0x07)
  169.             aerr();
  170.         comma();
  171.         t2 = addr(&e2);
  172.         if (t2 != S_DIR)
  173.             aerr();
  174.         comma();
  175.         expr(&e3, 0);
  176.         outab(op + 2*(espv&0x07));
  177.         outrb(&e2, R_PAG0);
  178.         if (e3.e_base.e_ap == NULL || e3.e_base.e_ap == dot.s_area) {
  179.             v1 = e3.e_addr - dot.s_addr - 1;
  180.             if ((v1 < -128) || (v1 > 127))
  181.                 aerr();
  182.             outab(v1);
  183.         } else {
  184.             outrb(&e3, R_PCR);
  185.         }
  186.         if (e3.e_mode != S_USER)
  187.             rerr();
  188.         break;
  189.  
  190.     default:
  191.         err('o');
  192.     }
  193. }
  194.  
  195. /*
  196.  * The next character must be a
  197.  * comma.
  198.  */
  199. VOID
  200. comma()
  201. {
  202.     if (getnb() != ',')
  203.         qerr();
  204. }
  205.  
  206. /*
  207.  * Machine specific initialization.
  208.  */
  209. VOID
  210. minit()
  211. {
  212. }
  213.